/**
 * 通过原型创建对象
 */
function inherit(p){
	if( p==null ) throw TypeError();
	if( Object.create ){
		return Object.create( p );
	}
	var type = typeof p;
	if( type!=='object' && type!=='function' ){
		throw TypeError();
	}
	function f(){}
	f.prototype = p;
	return new f();
}

/**
 * 从p中复制可枚举属性
 */
function extend(o,p){
	for(prop in p){
		o[prop] = p[prop];
	}
	return o;
}

/**
 * 从p中复制可枚举属性,如果o已经存在则不覆盖
 */
function merge(o,p){
	var prop;
	for(prop in p){
		if( o.hasOwnProperty(prop) ){
			continue;
		}
		o[prop] = p[prop];
	}
	return o;
}

/**
 * 如果o中属性在p中不存在则删除
 */
function restrict(o,p){
	var prop;
	for(prop in o){
		if( !( prop in p ) ){
			delete o[prop];
		}
	}
	return o;
}

/**
 * 删除o中与p中同名的属性
 */
function subtract(o,p){
	var prop;
	for(prop in p){
		delete o[prop];
	}
	return o;
}

/**
 * 取o,p两者属性的并集
 */
function unio(o,p){
	return extend( extend({},o),p );
}

/**
 * 取交集+p中属性
 */
function intersection(o,p){
	return restrict( extend({},o),p );
}

/**
 * 获取可枚举属性
 * 同es5的Obejct.keys()
 */
function keys(o){
	var prop,result = [];
	if( typeof o !== 'object' ){
		throw TypeError();
	}
	for( prop in o ){
		if( o.hasOwnProperty( prop ) ){
			result.push( prop );
		}
	}
	return result;
}

Object.defineProperty(Object.prototype,
	'extend',
	{
		writable: true,
		enumerable: false,
		configurable: true,
		value: function(o){
			var idx,
				names = Object.getOwnPropertyNames( o ),
				desc;
			for( idx=0;idx<names.length;idx++ ){
				if( names[idx] in this ){
					continue;
				}
				desc = Object.getOwnPropertyDescriptor(o,names[idx]);
				Object.defineProperty(this,desc);
			}
		}
	});

function classof(o){
	if( o === null ) return "Null";
	if( o === undefined ) return "Undefined";
	return Object.prototype.toString.call(o).slice(8,-1);
}
